package com.lzj.server.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.lzj.server.exceptions.BaseException;
import org.apache.commons.io.FilenameUtils;

import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * @author Lzj
 * @date 2025/5/6
 * @description
 */
public class FileUtils {

    /**
     * 校验文件格式
     */
    public static boolean isValidFileType(String fileName) {
        // 获取文件后缀名
        String fileExtension = FilenameUtils.getExtension(fileName).toLowerCase();
        // 定义允许的文件类型
        Set<String> allowedExtensions = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif", "bmp",
                "doc", "docx", "xls", "xlsx", "ppt", "pptx", "pdf", "txt",// Office格式
                "mp4", "mp3",
                "zip", "rar")); // 媒体格式
        // 检查文件后缀名是否在允许的文件类型集合中
        return allowedExtensions.contains(fileExtension);
    }

    /**
     * 构建 S3 / MinIO 对象存储路径
     * 示例路径：vimi/file/video/2025/06/21/A/uuid.mp4
     *
     * @param module            模块名（如 video、cover、avatar）
     * @param originalFilename  原始文件名
     * @param isRandNewFileName 是否使用随机 UUID 文件名
     * @return 构建后的对象存储路径（统一使用正斜杠 `/`）
     */
    public static String buildStoragePath(String module, String originalFilename, boolean isRandNewFileName) {

        // 模块路径（video、cover、comment 等）
        String modulePath = StrUtil.addSuffixIfNot(module, "/");

        // 日期路径 yyyy/MM/dd/
        String datePath = DateUtil.format(new Date(), "yyyy-MM-dd") + "/";

        // 随机字母路径
        char letter = (char) ('A' + RandomUtil.randomInt(26));
        String letterPath = letter + "/";

        // 文件后缀
        String extName = FileUtil.extName(originalFilename);
        String suffix = StrUtil.isNotBlank(extName) ? "." + extName : "";

        // 文件名（UUID 或原始名）
        String fileName = isRandNewFileName ? IdUtil.simpleUUID() + suffix : originalFilename;

        // 拼接路径
        String fullPath = StrUtil.join(
                "",
                modulePath,
                datePath,
                letterPath,
                fileName
        );

        return fullPath.replace("\\", "/"); // 确保跨平台安全
    }

    public static String getFileType(String fileName) {
        if (isValidFileType(fileName)) {
            throw new BaseException("非法文件格式");
        }
        return "." + FilenameUtils.getExtension(fileName).toLowerCase();
    }

    /**
     * 根据后缀得到文件类型
     */
    public static String getFileTypeBySuffix(String fileName) {
        String fileType = getFileType(fileName);
        return switch (fileType) {
            case ".jpg", ".jpeg", ".png", ".gif", ".bmp" -> "图片";
            case ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt" -> "Office";
            case ".mp4", ".mp3" -> "音视频";
            case ".zip", ".rar" -> "压缩包";
            default -> "未知";
        };
    }
}
